package org.jeecg.modules.oms.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.oms.entity.SemiProductSalesOrder;

import java.util.List;

/**
 * 半成品销售订单Mapper接口
 */
public interface SemiProductSalesOrderMapper extends BaseMapper<SemiProductSalesOrder> {

    /**
     * 分页查询半成品销售订单
     * @param page 分页参数
     * @param order 查询条件
     * @return 分页结果
     */
    IPage<SemiProductSalesOrder> selectOrderPage(Page<SemiProductSalesOrder> page, @Param("order") SemiProductSalesOrder order);

    /**
     * 根据订单号查询订单（同一租户下唯一）
     * @param orderNo 订单号
     * @param tenantId 租户ID
     * @return 订单信息
     */
    SemiProductSalesOrder selectByOrderNo(@Param("orderNo") String orderNo, @Param("tenantId") Integer tenantId);

    /**
     * 根据客户ID查询订单列表
     * @param customerId 客户ID
     * @return 订单列表
     */
    List<SemiProductSalesOrder> selectByCustomerId(@Param("customerId") String customerId);

    /**
     * 根据项目ID查询订单列表
     * @param projectId 项目ID
     * @return 订单列表
     */
    List<SemiProductSalesOrder> selectByProjectId(@Param("projectId") String projectId);

    /**
     * 根据状态查询订单列表
     * @param status 订单状态
     * @return 订单列表
     */
    List<SemiProductSalesOrder> selectByStatus(@Param("status") Integer status);

    /**
     * 统计订单数量
     * @param order 查询条件
     * @return 订单数量
     */
    Integer countOrders(@Param("order") SemiProductSalesOrder order);

    /**
     * 更新订单状态
     * @param id 订单ID
     * @param status 新状态
     * @param updateBy 更新人
     * @return 更新结果
     */
    int updateStatus(@Param("id") String id, @Param("status") Integer status, @Param("updateBy") String updateBy);

    /**
     * 更新订单金额信息
     * @param id 订单ID
     * @param totalAmount 总金额
     * @param paidAmount 已付金额
     * @param unpaidAmount 未付金额
     * @param payStatus 付款状态
     * @param updateBy 更新人
     * @return 更新结果
     */
    int updateAmount(@Param("id") String id, 
                    @Param("totalAmount") java.math.BigDecimal totalAmount,
                    @Param("paidAmount") java.math.BigDecimal paidAmount,
                    @Param("unpaidAmount") java.math.BigDecimal unpaidAmount,
                    @Param("payStatus") Integer payStatus,
                    @Param("updateBy") String updateBy);

    /**
     * 分页查询半成品销售订单（带关联信息）
     * @param page 分页参数
     * @param order 查询条件
     * @return 分页结果（包含客户名称和项目详细信息）
     */
    IPage<SemiProductSalesOrder> selectOrderPageWithDetail(Page<SemiProductSalesOrder> page, @Param("order") SemiProductSalesOrder order);
}
